package com.ssy.lingxi.member.merchant.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.entity.MemberLevelConfigDO;
import com.ssy.lingxi.member.merchant.entity.MemberLevelRightDO;
import com.ssy.lingxi.member.merchant.entity.MemberRelationDO;
import com.ssy.lingxi.member.merchant.model.bo.LevelBO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.LevelAndTagVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.MemberRightScoreVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.RoleIdAndNameVO;
import com.ssy.lingxi.member.merchant.model.vo.maintenance.response.MemberDetailRightConfigVO;

import java.util.List;

/**
 * 会员等级配置（内部工具类）相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2022-03-23
 */
public interface IBaseMemberLevelConfigService {
    /**
     * 是否存在等级配置
     * @param memberId 上级会员Id
     * @param roleId 上级会员角色Id
     * @param subRoleId 下级会员角色Id
     * @param level 等级
     * @return 存在-ture，不存在-false
     */
    Boolean existLevel(Long memberId, Long roleId, Long subRoleId, Integer level);

    /**
     * 查询指定等级
     * @param relationDO 会员关系
     * @param specificLevel 指定的等级
     * @return 指定等级，如果没有返回Null
     */
    MemberLevelConfigDO findLevel(MemberRelationDO relationDO, Integer specificLevel);

    /**
     * 查询指定等级
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @param subRoleId 下级会员角色Id
     * @param specificLevel 指定的等级
     * @return 指定等级，如果没有返回Null
     */
    MemberLevelConfigDO findLevel(Long memberId, Long roleId, Long subRoleId, Integer specificLevel);

    /**
     * 查询最小等级配置
     * @param relationDO 会员关系
     * @return 最小等级配置，如没有配置返回Null
     */
    MemberLevelConfigDO findFirstLevel(MemberRelationDO relationDO);

    /**
     * 查询最小等级配置
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @param subRoleId 下级会员角色Id
     * @return 最小等级配置，如没有配置返回Null
     */
    MemberLevelConfigDO findFirstLevel(Long memberId, Long roleId, Long subRoleId);

    /**
     * 查询下级会员的下一等级标签
     * @param relationDO 会员关系
     * @param levelDO    下级会员当前等级
     * @return 下一等级标签，如无下一等级返回空字符串
     */
    String findNextLevelTag(MemberRelationDO relationDO, MemberLevelRightDO levelDO);

    /**
     * 查询下级会员的下一等级标签
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @param subRoleId 下级会员角色Id
     * @param currentLevel 下级会员当前等级
     * @return 下一等级标签，如无下一等级返回空字符串
     */
    String findNextLevelTag(Long memberId, Long roleId, Long subRoleId, Integer currentLevel);

    /**
     * 查询下级会员的下一等级标签及升级阈值
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @param subRoleId 下级会员角色Id
     * @param currentLevel 下级会员当前等级
     * @return 下一等级标签，如无下一等级返回空字符串
     */
    LevelBO findNextLevel(Long memberId, Long roleId, Long subRoleId, Integer currentLevel);

    /**
     * 查询下级会员等级列表，转换为前端下拉框选项
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @return 下拉框选项
     */
    List<LevelAndTagVO> listSubMemberLevels(Long memberId, Long roleId);

    /**
     * 查询下级会员等级列表，转换为前端下拉框选项
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @param subRoleId 下级会员角色Id
     * @return 下拉框选项
     */
    List<LevelAndTagVO> listSubMemberLevels(Long memberId, Long roleId, Long subRoleId);

    /**
     * （新增下级会员时）查询下级会员等级列表，转换为前端下拉框选项
     * @param memberId 上级会员Id
     * @param roleId   上级会员角色Id
     * @param subRoleId 下级会员角色Id
     * @param memberTypeId 会员类型Id（不是枚举）
     * @return 下拉框选项
     */
    List<LevelAndTagVO> listSubMemberLevels(Long memberId, Long roleId, Long subRoleId, Long memberTypeId);

    /**
     * 查询会员平台通用、会员专有的权益积分
     *
     * @param upperMemberId 上级会员Id
     * @param upperRoleId   上级会员角色Id
     * @param subMemberId   下级会员Id
     * @param subRoleId     下级会员角色Id
     * @return 查询结果
     */
    Wrapper<MemberRightScoreVO> getMemberRightPoint(Long upperMemberId, Long upperRoleId, Long subMemberId, Long subRoleId);

    /**
     * 查询会员最低等级的权益列表
     *
     * @param upperMemberId 上级会员Id
     * @param upperRoleId   上级会员角色Id
     * @param subRoleId     下级会员角色Id
     * @return 查询结果
     */
    List<MemberDetailRightConfigVO> findSubMemberRights(Long upperMemberId, Long upperRoleId, Long subRoleId);

    /**
     * 查询会员等级配置的下级会员角色Id和角色名称列表（去重）
     * @param memberId 上级会员Id
     * @param roleId 上级会员角色Id
     * @return 查询结果
     */
    List<RoleIdAndNameVO> findLevelConfigRoles(Long memberId, Long roleId);
}
